package main

import (
	"context"
	"fmt"
	"log"
	"net/http"

	"go.uber.org/fx"
)

// Database 表示数据库连接
type Database struct{}

// NewDatabase 创建一个新的数据库连接
func NewDatabase() (*Database, error) {
	// 模拟数据库连接
	fmt.Println("Connecting to the database...")
	return &Database{}, nil
}

// HTTPServer 表示 HTTP 服务器
type HTTPServer struct {
	Server *http.Server
}

// NewHTTPServer 创建一个新的 HTTP 服务器
func NewHTTPServer(db *Database) (*HTTPServer, error) {
	mux := http.NewServeMux()
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World!")
	})

	server := &http.Server{
		Addr:    ":8080",
		Handler: mux,
	}

	return &HTTPServer{
		Server: server,
	}, nil
}

// Start 启动 HTTP 服务器
func (s *HTTPServer) Start(lc fx.Lifecycle) {
	lc.Append(fx.Hook{
		OnStart: func(ctx context.Context) error {
			fmt.Println("Starting HTTP server...")
			go func() {
				if err := s.Server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
					log.Fatalf("Failed to start HTTP server: %v", err)
				}
			}()
			return nil
		},
		OnStop: func(ctx context.Context) error {
			fmt.Println("Stopping HTTP server...")
			return s.Server.Shutdown(ctx)
		},
	})
}

func main() {
	app := fx.New(
		// 提供数据库连接组件
		fx.Provide(NewDatabase),
		// 提供 HTTP 服务器组件
		fx.Provide(NewHTTPServer),
		// 调用 Start 方法启动 HTTP 服务器
		fx.Invoke(func(lc fx.Lifecycle, s *HTTPServer) {
			s.Start(lc)
		}),
	)

	// 运行应用程序
	app.Run()
}
